package FooBarBibliotheque;

import java.io.Serializable;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.HashSet;

/* @authors vasquezs, haffafa, baldinof */
public class Ouvrage extends DocumentContenu implements Serializable {
    private static final long serialVersionUID = 1L;
    private String ISBN;
    private String nomEditeur;
    private GregorianCalendar dateParution;
    private String titre;
    private Public typePublic;
    private HashMap<Integer, Exemplaire> exemplaires;

    public Ouvrage(String ISBN, String nomEditeur, GregorianCalendar dateParution, String titre, Public typePublic) {
        super(titre);
        setISBN(ISBN);
        setNomEditeur(nomEditeur);
        setDateParution(dateParution);
        setTitre(titre);
        setTypePublic(typePublic);
        exemplaires = new HashMap<Integer, Exemplaire>();
    }

    public void setISBN(String ISBN) {
        this.ISBN = ISBN;
    }

    public String getISBN() {
        return ISBN;
    }

    public GregorianCalendar getDateParution() {
        return dateParution;
    }

    public void setDateParution(GregorianCalendar dateParution) {
        this.dateParution = dateParution;
    }

    public HashMap<Integer, Exemplaire> getExemplaires() {
        return exemplaires;
    }

    public void setExemplaires(HashMap<Integer, Exemplaire> exemplaires) {
        this.exemplaires = exemplaires;
    }

    public String getNomEditeur() {
        return nomEditeur;
    }

    public void setNomEditeur(String nomEditeur) {
        this.nomEditeur = nomEditeur;
    }

    public String getTitre() {
        return titre;
    }

    public void setTitre(String titre) {
        this.titre = titre;
    }

    public Public getTypePublic() {
        return typePublic;
    }

    public void setTypePublic(Public typePublic) {
        this.typePublic = typePublic;
    }

    public void creerExemplaire(GregorianCalendar date,TypeExemplaire typeExemplaire) {
        int numSeq = this.numeroSequentielSuivant();
        Exemplaire e = new Exemplaire(this, numSeq, date,typeExemplaire,dateParution);
        lierExemplaire(e, numSeq);
    }

    private String getStringDate() {
        return getDateParution().get(Calendar.DAY_OF_MONTH) + "/"
                + (getDateParution().get(Calendar.MONTH) + 1) + "/"
                + getDateParution().get(Calendar.YEAR);
    }

    public String infoOuvrage() {
        return "Titre: " + getTitre()
                + "\nNumero ISBN: " + getISBN()
                + "\nNom de editeur: " + getNomEditeur()
                + "\nDate de parution: " + getStringDate()
                + "\nType de public: " + getTypePublic()
                + "\nAuteurs: \n" + infoAuteur();

    }

    public String infoExemplaireOuvrage() {
        return super.infoDocument()
                + "\nNumero ISBN:\t" + getISBN()
                + "\nExemplaire:\t" + infoExemplaire();
    }

    public String infoExemplaire() {
        String str = "";
        Exemplaire e;
        for (int n : exemplaires.keySet()) {
            e = exemplaires.get(n);
            str += "- " + e + "\n";
            if (e.etatEprumte()) {
                str += e.infoEmprunt() + "\n";
            }
        }
        return str;
    }

    private void lierExemplaire(Exemplaire e, int numSeq) {
        exemplaires.put(numSeq, e);
    }

    private int numeroExemplaire() {
        return exemplaires.size();
    }

    private int numeroSequentielSuivant() {
        return this.numeroExemplaire() + 1;
    }

    public boolean compatibiliteAge(int age) {
        if (age <= 10 && typePublic == Public.enfant) {
            return true;
        }
        if (age < 10 && age <= 16 && typePublic == Public.ado) {
            return true;
        }
        if (age > 16 && typePublic == Public.adulte) {
            return true;
        }
        return false;

    }

    public Exemplaire unExemplaire(int numExplaire) {
        return exemplaires.get(numExplaire);
    }

    public String infoOuvrageSimple() {
        return "Numéro ISBN: " + ISBN
                + "\nTitre:" + titre + "\n";
    }
}
